package com.hxci.demo;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class Enhance {

//        private Logger log=Logger.getLogger(Enhance.class);
//        //前置增强
//        public void before(JoinPoint j)
//        {
//            String methodName=j.getSignature().getName();
//            String className=j.getTarget().getClass().getName();
//            System.out.println(className+"类"+methodName+"方法的前置增强");
//        }
//        //异常抛出增强
//        public void afterThrowing()
//        {
//
//            System.out.println("异常增强");
//        }
//        //后置增强
//        public void afterreturning(JoinPoint j)
//        {
//            String methodName=j.getSignature().getName();
//            String className=j.getTarget().getClass().getName();
//            System.out.println(className+"类"+methodName+"方法的后置增强");
//        }
//        //最终增强
//        public void after(JoinPoint j){
//            String methodName=j.getSignature().getName();
//            String className=j.getTarget().getClass().getName();
//            System.out.println(className+"类"+methodName+"方法的最终增强");
//        }
//        //环绕增强
//        public Object around(ProceedingJoinPoint j)
//        {
//            Object resoult=null;
//            System.out.println("环绕前");
//            try {
//                resoult=j.proceed();
//                System.out.println("环绕后");
//            } catch (Throwable e) {
//                e.printStackTrace();
//            }
//            return resoult;
//        }

    //环绕通知=上面4个通知
    //优势
    //  1.操作目标方法是否执行
    //  2.获取目标方法信息，例如：方法的参数、名字
    //  3.可以修改目标方法使用的参数与返回值
//    public Object aroundEnhance(ProceedingJoinPoint joinPoint){
//
//        Object result = null;
//
//        try {
//
//            //环绕前置通知输出
//            System.out.println("[环绕前置通知...写入日志]");
//
//            //获取目标方法的参数数组
////            Object[] args = joinPoint.getArgs();
//
//            //将参数值“播仔”修改为“播妞”
////            args[0]="波妞";
//
//            //获取目标方法的名字
////            String name = joinPoint.getSignature().getName();
////            System.out.println("目标对象方法名字："+name);
////
//            //执行目标方法
//            //result = joinPoint.proceed(); //按照目标方法原来参数执行
////            result = joinPoint.proceed(args); //按照新的参数数组执行目标方法
//
//            //环绕后置通知输出
//            System.out.println("[环绕后置通知...写入日志]");
//        } catch (Throwable throwable) {
//            throwable.printStackTrace();
//
//            //环绕异常通知输出
//            System.out.println("[环绕异常通知...写入日志]");
//        } finally {
//
//            //环绕最终通知输出
//            System.out.println("[环绕最终通知...写入日志]");
//        }
//
//        return  result;
//    }
//    }


        public void before(JoinPoint joinPoint) {
            System.out.println("AoP目标类是：" + joinPoint.getTarget());
            System.out.println("这是为前置通知！");
            System.out.println("方法名称:"+joinPoint.getSignature().getName());
        }

        public void afterReturning (JoinPoint joinPoint){
            System.out.println("这是返回通知（方法不出现异常时调用）！");
            System.out.println("方法名称:"+joinPoint.getSignature().getName());
        }
        public Object around (ProceedingJoinPoint point)throws Throwable {
            System.out.println("这是环绕通知之前的部分");
            Object object = point.proceed();
            System.out.println("这是环绕通知之后的部分");
            return object;
        }

        public void afterException () {
            System.out.println("异常通知");
        }

        public void after(){
            System.out.println("这是后置通知！");
        }


}